<?php

namespace App\Http\Controllers;

//use Illuminate\Http\Request;
use Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Models\UsersReg;
use Session;
use Redirect;

class UsersfaceController extends Controller
{
    
    public $allowType = array(
        //上传类型
        'image/gif','image/jpg','image/jpeg','image/png','image/x-png','image/pjpeg'
    ); 
    //限制大小
    public $allowSize = 10240000;   
    //上传的文件，经过裁切后，保存目录
    public $saveDir = "usersface/source";  
    //是否重命名，默认为true    
    public $isRename = true;         

    function __construct($allowType="",$allowSize="",$saveDir="",$isRename=true){
        if(!empty($allowType)) $this->allowType = $allowType;
        if(!empty($allowSize)) $this->allowSize = $allowSize;
        if(!empty($saveDir)) $this->saveDir = $saveDir;
        if(!empty($isRename)) $this->isRename = $isRename;        
    }

    public function editface($uid)
    {
        //会员修改头像
        //判断是否修改自己的资料
        if(Session::get('nameid')==$uid)
        {
            $users = UsersReg::find($uid);
            return view('ucenter.admin.editface',array(
                'users' => $users
                ));
        }
        else {
            // 跳转到要访问的会员中心
            return redirect('u/'.$uid);;
        }        
    }

    public function uploadface()
    {
        //上传头像图片的原始图片
        $this->nameid = $nameid = Session::get('nameid'); //上传的时候得到会员的uid

        // $arrTmp = $_FILES;
        // return var_dump($arrTmp);  //打印字段数据

        //获得文件名字的字段名字
        $this->facefile = 'facefile'; 

        $path = $this->move_uploaded(); 

        //获得上传图片的路径，为了裁切大头像和小头像使用
        Session::put('image', $path);    
        
        if($path == false){
            //上传文件有问题，输出错误信息
            return $this->errMsg;
        }else{
            //文件比规定的尺寸大则生成缩略图，小则保持原样
            $this->thumb($path,false,0); 
            //上传成功,返回字符‘ok’
            return 'ok';
        }
    }

    public function cutface()
    {
        //裁切头像图片
        $this->nameid = $nameid = Session::get('nameid'); //裁切的时候得到会员的uid
        $this->users = $users = UsersReg::find($this->nameid);

        $image = Session::get('image'); //上传裁切后的图片
        $this->img_x = $img_x = request::input('x');
        $this->img_y = $img_y = request::input('y');
        $this->img_w = $img_w = request::input('w');
        $this->img_h = $img_h = request::input('h');


        $res = $this->thumb($image,false,1);
        if($res == false){
            return '裁剪失败';
        }else{
            //头像修改成功
            return '头像修改成功！';
        }
    }

    /////上传和裁切图片处理//////

    function move_uploaded(){        
        //上传文件,为改变大小的原图
        if(!$this->is_uploaded()){
            return false;
        }

        if(!$this->chk_size()){
            return false;
        }

        if(!$this->chk_type()){
            return false;
        }

        //重命名
        if($this->isRename){
            $arrTmp = pathinfo($_FILES[$this->facefile]['name']);
            $extension = strtolower($arrTmp['extension']);
            //重命名新文件，上传的为原图
            $file_newname = 'face_' . $this->nameid . '.' . $extension; 
        }else{
            $file_newname = $_FILES[$this->facefile]['name'];
        }
        
        if(!file_exists($this->saveDir)){       //判断保存目录是否存在
            mkdir($this->saveDir,0777,true);    //建立保存目录
        }

        //移动文件
        $result = move_uploaded_file($_FILES[$this->facefile]['tmp_name'],$this->saveDir."/".$file_newname);

        if($result){
            //文件的成功保存路径
            $path = $this->saveDir."/".$file_newname;     
            return $path;
        }else{
            $this->chk_err($_FILES[$this->facefile]['error']);
        }
    
    }

    function is_uploaded(){
        if(empty($_FILES[$this->facefile]['name'])){
            $this->chk_err(4);    //没有文件被上传
        }else{
            //['tmp_name']文件被上传后在服务端储存的临时文件名，一般是系统默认，可以在php.ini的upload_tmp_dir指定
            //is_uploaded_file() 函数判断指定的文件是否是通过 HTTP POST 上传的
            if(is_uploaded_file($_FILES[$this->facefile]['tmp_name'])){
                return true;
            }else{
                $this->chk_err(-2);       //文件上传不合法
            }
        }
    }

    function chk_type(){
        if(!in_array($_FILES[$this->facefile]['type'],$this->allowType)){
            $this->chk_err(-3);         //上传的文件类型不被允许
        }else{
            return true;
        }
    }

    function chk_size(){
        if($_FILES[$this->facefile]['size'] > $this->allowSize){
            $this->chk_err(-4);          //上传的文件过大
        }else{
            return true;
        }
    }

    //判断上传文件的出错信息
    function chk_err($errID){
        $this->errID = $errID;
        switch($this->errID){
            case -4:
                $this->errMsg = "上传的文件过大";
                break;
            case -3:
                $this->errMsg = "只可以上传jpeg、jpg、png、gif格式的图片";
                break;
            case -2:
                $this->errMsg = "文件上传不合法";
                break;
            case -1:
                $this->errMsg = "无控件名传入";
                break;
            case 1:
                $this->errMsg = '上传的文件超出了php.ini中upload_max_filesize设定的最大值';
                break;
            case 2:
                $this->errMsg = '上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值';
                break;
            case 3:
                $this->errMsg = '文件只有部分被上传';
                break;
            case 4:
                $this->errMsg = '没有文件被上传';
                break;
            default:
                $this->errMsg = '其他';
                break;
        }
        return false;    
    }

    /**
     * 生成缩略图
     * @static
     * @access public
     * @param string $image  原图
     * @param string $type 图像格式
     * @param string $thumbname 缩略图文件名
     * @param string $maxWidth  宽度
     * @param string $maxHeight  高度
     * @param string $position 缩略图保存目录
     * @param boolean $interlace 启用隔行扫描
     * @param boolean $is_save 是否保留原图
     * @return void
     */
    function thumb($image,$is_save=true,$suofang=0,$type='',$maxWidth=400,$maxHeight=400,$interlace=true){
        // 获取原图信息
        $info  = $this->getImageInfo($image);
        if($info !== false) {
            $srcWidth  = $info['width'];
            $srcHeight = $info['height'];
            $type = empty($type)?$info['type']:$type;
            //把字符转成小写
            $type = strtolower($type); 
            $interlace  =  $interlace? 1:0;
            //销毁变量
            unset($info); 
            if ($suofang==1) {
                $width  = $srcWidth;
                $height = $srcHeight;
            } else {
                $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
                if($scale>=1) {
                    // 超过原图大小不再缩略
                    $width   =  $srcWidth;
                    $height  =  $srcHeight;
                }else{
                    // 缩略图尺寸
                    $width  = (int)($srcWidth*$scale);  //147
                    $height = (int)($srcHeight*$scale); //199
                }
            }
            // 载入原图
            //imagecreatefrom系列函数用于从文件或 URL 载入一幅图像，成功返回图像资源，失败则返回一个空字符串。 
            //如果图片为 .jpg 格式使用函数 //imagecreatefromjpeg()
            $createFun = 'ImageCreateFrom'.($type=='jpg'?'jpeg':$type); 
            $srcImg     = $createFun($image);

            //创建缩略图
            //imagecreatetruecolor()和imagecreate()
            if($type!='gif' && function_exists('imagecreatetruecolor'))
                $thumbImg = imagecreatetruecolor($width, $height);
            else
                $thumbImg = imagecreate($width, $height);

            // 复制图片,imagecopyresampled按裁切大小新建的图片
            if(function_exists("ImageCopyResampled"))
                imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight);
            else
                imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height,  $srcWidth,$srcHeight);
            if('gif'==$type || 'png'==$type) {
                //imagealphablending($thumbImg, false);//取消默认的混色模式
                //imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
                $background_color  =  imagecolorallocate($thumbImg,  0,255,0);  //  指派一个绿色
                imagecolortransparent($thumbImg,$background_color);  //  设置为透明色，若注释掉该行则输出绿色的图
            }
            // 对jpeg图形设置隔行扫描
            if('jpg'==$type || 'jpeg'==$type)   
            imageinterlace($thumbImg,$interlace);
            //$gray=ImageColorAllocate($thumbImg,255,0,0);
            //ImageString($thumbImg,2,5,5,"ThinkPHP",$gray);
            // 生成图片
            $imageFun = 'image'.($type=='jpg'?'jpeg':$type);

            if($type == 'png'){
                //quality参数错误了，5.1以前版本的是0-99, 然后5.1以后改为0-9了，这个参数指的是图片的压缩等级
                $quality = 4;
            }else{
                $quality = 100;
            }

            //裁剪
            if ($suofang==1) {

                $this->userDir = 'usersface/' . $this->nameid; //保存用户的（大小）头像的目录
                if(!file_exists($this->userDir)){       //判断保存目录是否存在
                    mkdir($this->userDir,0777,true);    //建立保存目录
                }

                if($type == 'jpeg'){
                    //为了把大小头像的jpeg扩展名换成jpg扩展名（jpeg,jpg图片都变成jpg扩展名）
                    $type = 'jpg';
                }
                
                //大头像名字格式,face_1_max.jpeg    
                //$thumbname01 = 'usersface/face_' . $this->nameid . '_max.' . $type; 
                $thumbname01 = $this->userDir . '/face_' . $this->nameid . '_max.' . $type; 
                //小头像名字格式,face_1_min.jpeg     
                //$thumbname02 = 'usersface/face_' . $this->nameid . '_min.' . $type;    
                $thumbname02 = $this->userDir . '/face_' . $this->nameid . '_min.' . $type;     

                //imagegif()、imagejpeg()、imagepng() 和 imagewbmp() 函数分别允许以 GIF、JPEG、PNG 和 WBMP 格式将图像输出到浏览器或文件
                $imageFun($thumbImg,$thumbname01,$quality);
                $imageFun($thumbImg,$thumbname02,$quality);

                $thumbImg01 = imagecreatetruecolor(200,200);
                imagecopyresampled($thumbImg01,$thumbImg,0,0,$this->img_x,$this->img_y,200,200,$this->img_w,$this->img_h);

                $thumbImg02 = imagecreatetruecolor(50,50);
                imagecopyresampled($thumbImg02,$thumbImg,0,0,$this->img_x,$this->img_y,50,50,$this->img_w,$this->img_h);

                $imageFun($thumbImg01,$thumbname01,$quality);
                $imageFun($thumbImg02,$thumbname02,$quality);
                //文件删除,不保裁切后的原图
                //unlink($image);
                //释放与图像关联的内存
                imagedestroy($thumbImg01);
                imagedestroy($thumbImg02);
                imagedestroy($thumbImg);
                imagedestroy($srcImg);

                //保存头像到数据库
                $this->users->avatar_file = $thumbname01; //大头像路径
                $this->users->avatar_file_min = $thumbname02; //小头像路径
                //裁切后的原图（为了加载使用）,face_1.jpeg
                //$this->users->avatar_file_def = $image;
                $this->users->save();

                return true;
            }else{
                if($is_save == false){  
                    //缩略图覆盖原图，缩略图的路径还是原图路径                                        
                    $imageFun($thumbImg,$image,$quality);
                }else{
                    //缩略图与原图同时存在，
                    $thumbname03 = substr_replace($image,"03.".$type,$length);  
                    $imageFun($thumbImg,$thumbname03,$quality);

                    imagedestroy($thumbImg);
                    imagedestroy($srcImg);
                    //返回缩略图的路径，字符串
                    return $thumbname03 ;                   
                }
            }

        }
        return false;
    }

    /**
     * 取得图像信息
     * @static
     * @access public
     * @param string $image 图像文件名
     * @return mixed
     */
    function getImageInfo($img) {
        $imageInfo = getimagesize($img);
        if( $imageInfo!== false) {
            $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
            $imageSize = filesize($img);
            $info = array(
                "width"     =>$imageInfo[0],
                "height"    =>$imageInfo[1],
                "type"      =>$imageType,
                "size"      =>$imageSize,
                "mime"      =>$imageInfo['mime'],
            );
            return $info;
        }else {
            return false;
        }
    }    
   
}
